package cn.wolfcode.wolf2w.service.impl;

import cn.wolfcode.wolf2w.domain.Banner;
import cn.wolfcode.wolf2w.domain.Destination;
import cn.wolfcode.wolf2w.exception.LogicException;
import cn.wolfcode.wolf2w.query.BannerQuery;
import cn.wolfcode.wolf2w.repository.BannerRepository;
import cn.wolfcode.wolf2w.service.IBannerService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.*;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.stereotype.Service;
import org.springframework.util.StringUtils;

import java.util.List;

/**
 * 游记推荐业务层的实现类
 */
@Service
public class BannerServiceImpl implements IBannerService {

    //  注入BannerRepository持久层接口
    @Autowired
    private BannerRepository bannerRepository;

    @Autowired
    private MongoTemplate mongoTemplate;

    //  插入单个方法
    @Override
    public void insert(Banner banner) {

        //  id自动生成，手动设置为空
        banner.setId(null);

        if (banner.getSequence() != null) {
            //  调用持久层接口的save方法执行插入单个游记推荐对象
            bannerRepository.save(banner);
        } else {
            throw new LogicException("该序号不能为空");
        }

    }

    //  删除单个方法
    @Override
    public void deleteById(String id) {

        //  调用持久层接口的deleteById方法执行删除单个游记推荐对象
        bannerRepository.deleteById(id);
    }

    //  修改单个方法
    @Override
    public void updateById(Banner banner) {

        //  调用持久层接口的save方法执行修改单个游记推荐对象
        bannerRepository.save(banner);
    }

    //  查询单个方法
    @Override
    public Banner selectById(String id) {

        //  调用持久层接口的findById方法执行查询单个游记推荐对象
        return bannerRepository.findById(id).orElse(null);
    }

    //  查询所有方法
    @Override
    public List<Banner> selectAll() {

        //  调用持久层接口的findAll方法执行查询所有游记推荐对象
        return bannerRepository.findAll();
    }

    //  分页
    @Override
    public Page<Banner> query(BannerQuery qo) {

        //  查询对象
        Query query = new Query();

        //  调用mongodb服务中的count方法
        //  传入上面的查询对象和Banner的字节码对象
        //  返回一个满足条件的总记录数
        long totalCount = mongoTemplate.count(query, Banner.class);

        //  若查询出来的总记录数为零时
        if (totalCount == 0) {

            //  直接返回一个空集合e
            return Page.empty();
        }

        //  调用Pageable的of方法
        //  传入qo对象的当前页，qo对象的当前页显示的最大记录数，排序的顺序，通过_id来排序
        Pageable pageable = PageRequest.of(qo.getCurrentPage()-1, qo.getPageSize(), Sort.Direction.ASC, "_id");

        //  把限制条件加入到查询对象中
        query.with(pageable);

        //  调用mongodb服务中的find方法
        //  传入上面的查询对象和Banner的字节码对象
        //  返回一个满足条件的游记推荐对象的集合数据
        List<Banner> banners = mongoTemplate.find(query, Banner.class);

        //  返回一个PageImpl的集合
        //  传入一个满足条件的游记推荐对象的集合数据对象
        //  传入限制条件
        //  返回一个满足条件的总记录数
        return new PageImpl<>(banners, pageable, totalCount);
    }

    //  游记/攻略显示
    @Override
    public List<Banner> queryBanner(int state, int type) {

        //  按序号排序，截取前五个
        Pageable pageable = PageRequest.of(0, 5, Sort.Direction.ASC, "sequence");

        //  使用jpa查询 状态为正常，且类型正确
        List<Banner> bannerList = bannerRepository.findByStateAndType(state, type, pageable);

        return bannerList;
    }


}
